package com.dongdong.zhuangji.utils;

import com.dongdong.zhuangji.entity.PileData;
import com.dongdong.zhuangji.service.PileDataService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Component
public class ExcelImporter {

    @Autowired
    private PileDataService pileDataService;

    public void importFromExcel(String filePath) throws IOException, ParseException {
        FileInputStream file = new FileInputStream(new File(filePath));
        Workbook workbook = new XSSFWorkbook(file);
        Sheet sheet = workbook.getSheetAt(0);

        List<PileData> pileDataList = new ArrayList<>();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        // 跳过表头，从第2行开始
        for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
            Row row = sheet.getRow(rowIndex);
            if (row == null) {
                continue; // 跳过空行
            }

            PileData pileData = new PileData();

            try {
                // ---------------------- 数值型字段（支持负数、空值） ----------------------
                pileData.setId(getIntegerValue(row, 0)); // ID
                pileData.setMileage(getDoubleValue(row, 2)); // 里程
                pileData.setOffset(getDoubleValue(row, 3)); // 偏移量（支持负数）
                pileData.setCoordinateX(getDoubleValue(row, 4)); // 坐标X
                pileData.setCoordinateY(getDoubleValue(row, 5)); // 坐标Y
                pileData.setPileBottomElevation(getDoubleValue(row, 6)); // 桩底标高
                pileData.setPileTopElevation(getDoubleValue(row, 7)); // 桩顶标高
                pileData.setPileDiameter(getDoubleValue(row, 8)); // 桩径
                pileData.setPileLength(getDoubleValue(row, 9)); // 桩长
                pileData.setSteelCageLength(getDoubleValue(row, 10)); // 钢筋笼长度
                pileData.setOverPouringLength(getDoubleValue(row, 11)); // 超灌长度
                pileData.setGroundElevation(getDoubleValue(row, 12)); // 地面标高
                // 实际桩底标高：允许空值，默认0.0（可根据业务改为null）
                pileData.setActualPileBottomElevation(getDoubleValue(row, 13));

                // ---------------------- 字符串型字段（保留前导零） ----------------------
                pileData.setPileNumber(getStringValue(row, 1)); // 桩号（如55-1）
                pileData.setTestBlockNumber(getStringValue(row, 20)); // 试块编号（保留022前导零）

                // ---------------------- 日期时间字段（支持空值） ----------------------
                pileData.setExcavationTime(getDateTime(row, 14, dateFormat)); // 开挖时间
                pileData.setHoleOpeningTime(getDateTime(row, 15, dateFormat)); // 成孔时间（空值返回null）
                pileData.setHoleCompletionTime(getDateTime(row, 16, dateFormat)); // 终孔时间
                pileData.setReinforcementCageLoweringTime(getDateTime(row, 17, dateFormat)); // 下钢筋笼时间
                pileData.setConduitLoweringTime(getDateTime(row, 18, dateFormat)); // 下导管时间（空值返回null）
                pileData.setPouringTime(getDateTime(row, 19, dateFormat)); // 浇筑时间（空值返回null）

            } catch (Exception e) {
                // 记录错误行号并跳过当前行
                System.err.println("第 " + (rowIndex + 1) + " 行数据解析失败：" + e.getMessage());
                continue;
            }

            pileDataList.add(pileData);
        }

        workbook.close();
        file.close();

        // 批量保存数据（非空列表）
        if (!pileDataList.isEmpty()) {
            pileDataService.saveBatch(pileDataList);
        }
    }

    // ======================== 通用字段读取方法 ========================

    /** 获取整数（处理空值、数值型、字符串型） */
    private int getIntegerValue(Row row, int columnIndex) {
        try {
            Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
            if (cell.getCellType() == CellType.BLANK) return 0; // 空值默认0
            if (cell.getCellType() == CellType.NUMERIC) {
                return (int) cell.getNumericCellValue();
            } else if (cell.getCellType() == CellType.STRING) {
                return Integer.parseInt(cell.getStringCellValue().trim());
            }
        } catch (Exception e) {
            return 0; // 解析失败默认0
        }
        return 0;
    }

    /** 获取双精度浮点数（支持负数、空值、字符串型） */
    private double getDoubleValue(Row row, int columnIndex) {
        try {
            Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
            if (cell.getCellType() == CellType.BLANK) return 0.0; // 空值默认0.0
            if (cell.getCellType() == CellType.NUMERIC) {
                return cell.getNumericCellValue();
            } else if (cell.getCellType() == CellType.STRING) {
                return Double.parseDouble(cell.getStringCellValue().trim());
            }
        } catch (Exception e) {
            return 0.0; // 解析失败默认0.0
        }
        return 0.0;
    }

    /** 获取字符串（保留前导零，处理空值） */
    private String getStringValue(Row row, int columnIndex) {
        try {
            Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
            cell.setCellType(CellType.STRING); // 强制转为字符串类型
            return cell.getStringCellValue().trim();
        } catch (Exception e) {
            return ""; // 空值或异常返回空字符串
        }
    }

    /** 获取日期时间（支持空值、数值型日期、字符串型日期） */
    private Date getDateTime(Row row, int columnIndex, SimpleDateFormat dateFormat) {
        try {
            Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
            if (cell.getCellType() == CellType.BLANK) {
                return null; // 空单元格返回null
            }
            // 处理Excel原生日期（数值型）
            if (DateUtil.isCellDateFormatted(cell)) {
                return cell.getDateCellValue();
            }
            // 处理字符串型日期
            String dateStr = cell.getStringCellValue().trim();
            if (!dateStr.isEmpty()) {
                return dateFormat.parse(dateStr);
            }
        } catch (ParseException e) {
            System.err.println("日期解析失败：" + e.getMessage());
        }
        return null;
    }
}